package model.materiasYCatedras;
import java.util.List;
import java.util.ArrayList;

import model.Universidad;
import model.areas.Area;
import model.carrerasYPlanes.PlanDeEstudio;
import model.interfaces.CatedraIMPL;
import model.interfaces.MateriaIMPL;



public class MateriaPorPlanDeEstudio implements MateriaIMPL{
	private Materia materia;
	private int dificultad;
	private int horasSemanales;
	private TipoCursada tipoCursada;
	private Programa programa;
	private List<Catedra> catedras = new ArrayList<Catedra>();
	private List<MateriaPorPlanDeEstudio> correlativas = new ArrayList<MateriaPorPlanDeEstudio>();
	private List<Equipamiento> equipamiento = new ArrayList<Equipamiento>();
	private Docente docenteTitular;
	private boolean promocionable;
	private PlanDeEstudio planDeEstudio;
	private TipoMateria tipoMateria;
	private Area area;
	 
	
	// Getters && Setters //
	
	public Area getArea() {
		return area;
	}

	public void setArea(Area area) {
		this.area = area;
	}

	public TipoMateria getTipoMateria() {
		return tipoMateria;
	}
	public void setTipoMateria(TipoMateria tipoMateria) {
		this.tipoMateria = tipoMateria;
	}

	public PlanDeEstudio getPlanDeEstudio() {
		return planDeEstudio;
	}
	
	public void setPlanDeEstudio(PlanDeEstudio planDeEstudio) {
		this.planDeEstudio = planDeEstudio;
	}
	
	public boolean getPromocionable() {
		return promocionable;
	}

	public void setPromocionable(boolean promocionable) {
		this.promocionable = promocionable;
	}

	public Materia getMateria() {
		return materia;
	}

	public void setMateria(Materia materia) {
		this.materia = materia;
	} 
	
	public int getDificultad() {
		return dificultad;
	}

	public void setDificultad(int dificultad) {
		this.dificultad = dificultad;
	}

	public int getHorasSemanales() {
		return horasSemanales;
	}

	public void setHorasSemanales(int horasSemanales) {
		this.horasSemanales = horasSemanales;
	}
	
	public TipoCursada getTipoCursada() {
		return tipoCursada;
	}

	public void setTipoCursada(TipoCursada tipoCursada) {
		this.tipoCursada = tipoCursada;
	}

	public Programa getPrograma() {
		return programa;
	}

	public void setPrograma(Programa programa) {
		this.programa = programa;
	}

	public List<Catedra> getCatedras() {
		return catedras;
	}

	public void setCatedras(List<Catedra> catedras) {
		this.catedras = catedras;
	}

	public List<MateriaPorPlanDeEstudio> getCorrelativas() {
		return correlativas;
	}

	public void setCorrelativas(List<MateriaPorPlanDeEstudio> correlativas) {
		this.correlativas = correlativas;
	}

	public List<Equipamiento> getEquipamiento() {
		return equipamiento;
	}

	public void setEquipamiento(List<Equipamiento> equipamiento) {
		this.equipamiento = equipamiento;
	}

	public Docente getDocenteTitular() {
		return docenteTitular;
	}
	
	public void setDocenteTitular(Docente docenteTitular) {
		this.docenteTitular = docenteTitular;
	}
	
	public Persona getProfesor(){
		return this.getDocenteTitular().getPersona();
	}
	
	// Fin Getters && Setters //

	
	// Constructor //
	public MateriaPorPlanDeEstudio(Materia unaMateria, PlanDeEstudio plan){
		super();
		this.materia = unaMateria;
		this.planDeEstudio = plan;
		plan.agregarMateria(this);
		Universidad.getInstance().agregarMateria(this);
	}
	
	public MateriaPorPlanDeEstudio(Materia unaMateria,
								   PlanDeEstudio planDeEstudio,
								   Area area,
								   Docente docTitular,
								   Programa elPrograma,
								   int cantCatedras,
								   TipoCursada tipoCursada,
								   TipoMateria tipoMateria, 
								   int dificultad,
								   int cantHorasSemanales){
		/////////////////////// FIN PARAMETROS ////////////
		
		this.setMateria(unaMateria);
		this.setPlanDeEstudio(planDeEstudio);
		this.setArea(area);
		this.inscribirDocente(docTitular);
		this.setPrograma(elPrograma);
		this.crearCatedras();
		this.setTipoCursada(tipoCursada);
		this.setTipoMateria(tipoMateria);
		this.setDificultad(dificultad);
		this.setHorasSemanales(cantHorasSemanales);
		planDeEstudio.agregarMateria(this);
		Universidad.getInstance().agregarMateria(this);
	}
	
	public MateriaPorPlanDeEstudio(){
		
	}
	
	////////////////
	
	
	/**
	 * Cuando se cree una materia 
	 * por plan de estudio deberia 
	 * asignarse si es o no promocionable
	 * 
	 * @return
	 */
	public boolean esPromocionable(){
		return this.getPromocionable();
	}
	
	/**
	 * Devuelve la dificultad de 1 a 10 
	 * 	multiplicado por horas semanales
	 * @return
	 */
	
	public int getCreditos(){
		return this.getDificultad() * this.getHorasSemanales();
	}
	
	public void crearCatedras(){
		for (int i = 1 ; i < this.getCatedras().size() ; i++){
			this.getCatedras().add(new Catedra(this, "Catedra" + i));
		}
	}
	
	public void inscribirDocente(Docente unDocente){
		if (this.getArea() == unDocente.getArea()){
			this.setDocenteTitular(unDocente);
		}
		else {
			// TODO: Aca deberia lanzar una excepcion por diferente area
		}
	}
	
	@Override
	public List<CatedraIMPL> getCatedrasIMPL() {
		// TODO Auto-generated method stub
		List<CatedraIMPL> list = new ArrayList<CatedraIMPL>();
		for (Catedra catedra : this.getCatedras()) {
			list.add(catedra);
		}
		return list;
	}
	
	public String toString(){
		return this.getMateria().getNombre();
	}
	
}
